package com.vvv.designpattern.controller;

import com.vvv.designpattern.adapter.Login3rdAdapter;
import com.vvv.designpattern.pojo.BusinessLaunch;
import com.vvv.designpattern.pojo.UserInfo;
import com.vvv.designpattern.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author vvv
 * @date 2023-11-14 15 09
 * discription
 * 第三方登录地址：
 * https://gitee.com/oauth/authorize?client_id=5b0295ed32f04822e1f3997f017afc7948699cae854130d9dbba333531c9ebf5&redirect_uri=http://localhost:8081/gitee&response_type=code&state=GITEE
 *
 * 个人感觉还是适配器模式比较好，虽然说他只能将所以第三方登录的逻辑都写到一个类里面，但是他的整个模式的调用链路非常短，容易理解
 *
 * ======================================================================================
 * 第三方的登录流程：
 * 详细流程看第40页
 * ======================================================================================
 * 业务投放：
 * 主要思想为通过责任链模式，筛选出适合的业务投放内容，然后返回给前端
 * 流程：
 * 1. 那到用户的信息比如（city sex product
 * 2. 查询出全部业务投放的信息
 * 3. 通过业务部门配置的责任链顺序(apollo配置）去创建责任链
 * 4. 调用责任链头结点去过滤投放内容信息
 * 5. 返回给前端
 * ======================================================================================
 * 开具电子发票：
 * 流程：
 * 1. service调用代理类directorProxy
 * 2. directorProxy为建造者模式添加了检验参数的次要逻辑
 * 3. 建造者模式（导演类调用具体建造者）通过controller一路传下来的参数进行对象的创建
 * 4. 返回
 * ======================================================================================
 */
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private Login3rdAdapter login3rdAdapter;

    @PostMapping("/ticket")
    public Object createTicket(String type, String productId
            , String content, String title, String bankInfo, String taxId) {
        return userService.createTicket(type, productId, content, title, bankInfo, taxId);
    }

    /**
     * 调用这个接口之前要GITBUSH中启动apollo，命令为；./dome.sh start
     * @param city
     * @param sex
     * @param product
     * @return
     */
    @PostMapping("/business/launch")
    public List<BusinessLaunch> filterBusinessLaunch(@RequestParam("city") String city,
                                                     @RequestParam("sex") String sex,
                                                     @RequestParam("product") String product) {
        return userService.filterBusinessLaunch(city, sex, product);
    }

    /**
     * gitee第三方登录的回调方法
     * @param code
     * @param state
     * @return
     */
    @GetMapping("/gitee")
    public String gitee(String code, String state) {
        return login3rdAdapter.loginByGitee(code, state);
    }

    @PostMapping("/login")
    public String login(String account, String password) {
        return userService.login(account, password);
    }

    @PostMapping("/register")
    public String register(@RequestBody UserInfo userInfo) {
        return userService.register(userInfo);
    }
}
